package com.fjwt.gz.mgr.ctrl.award.virtual;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.fjwt.gz.core.model.ApiRes;
import com.fjwt.gz.db.dto.AwardVirtualDTO;
import com.fjwt.gz.db.vo.AwardVirtualVO;
import com.fjwt.gz.mgr.ctrl.CommonCtrl;
import com.fjwt.gz.service.impl.AwardVirtualService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/***
 * 虚拟奖品管理
 * @Author: cyh
 * @Date:
 */
@RestController
@Slf4j
@RequestMapping("/api/award/virtual")
public class AwardVirtualController extends CommonCtrl {

    @Autowired
    private AwardVirtualService awardVirtualService;


    /**
     * 虚拟奖品列表
     *
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_VIRTUAL_COUPON_INFO')")
    @GetMapping
    public ApiRes list() {
        AwardVirtualDTO awardVirtualDTO = getObject(AwardVirtualDTO.class);
        log.info("pc端查询虚拟奖品列表，请求地址：/api/award/virtual，请求参数：{}", JSONUtil.toJsonStr(awardVirtualDTO));
        IPage<AwardVirtualVO> page = awardVirtualService.queryList(getIPage(true), awardVirtualDTO);
        log.info("pc端查询虚拟奖品列表，请求地址：/api/award/virtual，返回结果：{}", JSONUtil.toJsonStr(page));
        return ApiRes.page(page);
    }

    /**
     * 查看虚拟奖品详情
     *
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_VIRTUAL_COUPON_INFO_VIEW')")
    @GetMapping("/getDetail")
    public ApiRes getAwardVirtualById() {
        AwardVirtualDTO awardVirtualDTO = getObject(AwardVirtualDTO.class);
        log.info("pc端查看虚拟奖品详情，请求地址：/api/award/virtual/getDetail，请求参数：{}", JSONUtil.toJsonStr(awardVirtualDTO.getVirtualId()));
        AwardVirtualVO vo=awardVirtualService.getDetail(awardVirtualDTO.getVirtualId());
        log.info("pc端查看虚拟奖品详情，请求地址：/api/award/virtual/getDetail，返回结果：{}", JSONUtil.toJsonStr(vo));
        AwardVirtualVO data = new AwardVirtualVO();
        BeanUtils.copyProperties(vo, data);
        return ApiRes.ok(data);
    }

    /**
     * 新增虚拟奖品
     *
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_VIRTUAL_COUPON_INFO_ADD')")
    @PostMapping("/add")
    public ApiRes add() {
        AwardVirtualDTO awardVirtualDTO = getObject(AwardVirtualDTO.class);
        // 当前登录用户信息
        awardVirtualDTO.setCreatedUid(getCurrentUser().getSysUserId());
        log.info("pc端新增虚拟奖品，请求地址：/api/award/virtual/add，请求参数：{}", JSONUtil.toJsonStr(awardVirtualDTO));
        AwardVirtualVO awardVirtualVO = awardVirtualService.saveAwardVirtual(awardVirtualDTO);
        return ApiRes.ok(awardVirtualVO);
    }

    /**
     * 修改虚拟券奖品详情
     *
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_VIRTUAL_COUPON_INFO_EDIT')")
    @PostMapping("/update")
    public ApiRes update() {
        AwardVirtualDTO awardVirtualDTO = getObject(AwardVirtualDTO.class);
        log.info("pc端修改虚拟奖品详情，请求地址：/api/award/virtual/update，请求参数：{}", JSONUtil.toJsonStr(awardVirtualDTO));
        awardVirtualService.updateAwardVirtual(awardVirtualDTO);
        return ApiRes.ok();
    }


    /**
     * 更改虚拟奖品状态
     *
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_VIRTUAL_COUPON_INFO_EDIT')")
    @PutMapping("/state")
    public ApiRes updateState(Long virtualId, Integer state) {
        log.info("pc端更改虚拟奖品状态，请求地址：/api/award/virtual/state，请求参数：{}", JSONUtil.toJsonStr(virtualId));
        awardVirtualService.updateState(virtualId, state);
        return ApiRes.ok();
    }

    /**
     * 删除虚拟奖品
     *
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_VIRTUAL_COUPON_INFO_DEL')")
    @DeleteMapping("/delete")
    public ApiRes delete() {
        Long virtualId = getValLong("virtualId");
        log.info("pc端删除虚拟奖品，请求地址：/api/award/virtual/delete，请求参数：{}", JSONUtil.toJsonStr(virtualId));
        awardVirtualService.delete(virtualId);
        return ApiRes.ok();
    }

    /**
     * 获取未分配活动的虚拟券奖品列表
     *
     * @return
     */
    @RequestMapping(value = "/usable", method = RequestMethod.GET)
    public ApiRes listWithoutActivity() {
        AwardVirtualDTO awardVirtualDTO = getObject(AwardVirtualDTO.class);
        log.info("pc端获取未分配活动的虚拟券奖品列表，请求地址：/api/award/virtual/usable，请求参数：{}", JSONUtil.toJsonStr(awardVirtualDTO));
        List<AwardVirtualVO> list = awardVirtualService.queryList(awardVirtualDTO);
        log.info("pc端获取未分配活动的虚拟券奖品列表，请求地址：/api/award/virtual/usable，返回结果：{}", JSONUtil.toJsonStr(list));
        return ApiRes.ok(list);
    }


}
